home *** CD-ROM | disk | FTP | other *** search
/ Young Minds / Young Minds Interactive CD-ROM.ISO / dungeon / verbs.f < prev    next >
Encoding:
Text File  |  1987-09-16  |  17.0 KB  |  896 lines

  1. C VAPPLI- MAIN VERB PROCESSING ROUTINE
  2. C
  3. C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
  4. C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
  5. C WRITTEN BY R. M. SUPNIK
  6. C
  7. C DECLARATIONS
  8. C
  9.     LOGICAL FUNCTION VAPPLI(RI)
  10.     IMPLICIT INTEGER (A-Z)
  11.     LOGICAL LIT,OBJACT
  12.     LOGICAL QEMPTY,RMDESC,CLOCKD
  13.     LOGICAL QOPEN,EDIBLE,DRKBLE
  14.     LOGICAL TAKE,PUT,DROP,WALK
  15.     LOGICAL QHERE,SVERBS,FINDXT,OAPPLI,F
  16. #include "parser.h"
  17. #include "gamestate.h"
  18. #include "state.h"
  19. C
  20.     COMMON /STAR/ MBASE,STRBIT
  21. #include "rooms.h"
  22. #include "rflag.h"
  23. #include "rindex.h"
  24. #include "xsrch.h"
  25. #include "objects.h"
  26. #include "oflags.h"
  27. #include "oindex.h"
  28. #include "advers.h"
  29. #include "verbs.h"
  30. C
  31. C FUNCTIONS AND DATA
  32. C
  33.     QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0
  34.     EDIBLE(R)=and(OFLAG1(R),FOODBT).NE.0
  35.     DRKBLE(R)=and(OFLAG1(R),DRNKBT).NE.0
  36.     DATA MXNOP/39/,MXSMP/99/
  37. C VAPPLI, PAGE 2
  38. C
  39.     VAPPLI=.TRUE.
  40. C                        !ASSUME WINS.
  41. C
  42.     IF(PRSO.GT.220) GO TO 5
  43. C
  44.     IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
  45. C                        !SET UP DESCRIPTORS.
  46. 5    IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
  47.     AV=AVEHIC(WINNER)
  48.     RMK=372+RND(6)
  49. C                        !REMARK FOR HACK-HACKS.
  50. C
  51.     IF(RI.EQ.0) GO TO 10
  52. C                        !ZERO IS FALSE.
  53.     IF(RI.LE.MXNOP) RETURN
  54. C                        !NOP?
  55.     IF(RI.LE.MXSMP) GO TO 100
  56. C                        !SIMPLE VERB?
  57.     GO TO (18000,20000,
  58. &           22000,23000,24000,25000,26000,27000,28000,29000,30000,
  59. &     31000,32000,33000,34000,35000,36000,      38000,39000,40000,
  60. &     41000,42000,43000,44000,45000,46000,47000,48000,49000,50000,
  61. &     51000,52000,53000,      55000,56000,      58000,59000,60000,
  62. &                 63000,64000,65000,66000,      68000,69000,70000,
  63. &     71000,72000,73000,74000,            77000,78000,
  64. &     80000,81000,82000,83000,84000,85000,86000,87000,88000),
  65. &        (RI-MXSMP)
  66.     CALL BUG(7,RI)
  67. C
  68. C ALL VERB PROCESSORS RETURN HERE TO DECLARE FAILURE.
  69. C
  70. 10    VAPPLI=.FALSE.
  71. C                        !LOSE.
  72.     RETURN
  73. C
  74. C SIMPLE VERBS ARE HANDLED EXTERNALLY.
  75. C
  76. 100    VAPPLI=SVERBS(RI)
  77.     RETURN
  78. C VAPPLI, PAGE 3
  79. C
  80. C V100--    READ.  OUR FIRST REAL VERB.
  81. C
  82. 18000    IF(LIT(HERE)) GO TO 18100
  83. C                        !ROOM LIT?
  84.     CALL RSPEAK(356)
  85. C                        !NO, CANT READ.
  86.     RETURN
  87. C
  88. 18100    IF(PRSI.EQ.0) GO TO 18200
  89. C                        !READ THROUGH OBJ?
  90.     IF(and(OFLAG1(PRSI),TRANBT).NE.0) GO TO 18200
  91.     CALL RSPSUB(357,ODI2)
  92. C                        !NOT TRANSPARENT.
  93.     RETURN
  94. C
  95. 18200    IF(and(OFLAG1(PRSO),READBT).NE.0) GO TO 18300
  96.     CALL RSPSUB(358,ODO2)
  97. C                        !NOT READABLE.
  98.     RETURN
  99. C
  100. 18300    IF(.NOT.OBJACT(X)) CALL RSPEAK(OREAD(PRSO))
  101.     RETURN
  102. C
  103. C V101--    MELT.  UNLESS OBJECT HANDLES, JOKE.
  104. C
  105. 20000    IF(.NOT.OBJACT(X)) CALL RSPSUB(361,ODO2)
  106.     RETURN
  107. C
  108. C V102--    INFLATE.  WORKS ONLY WITH BOATS.
  109. C
  110. 22000    IF(.NOT.OBJACT(X)) CALL RSPEAK(368)
  111. C                        !OBJ HANDLE?
  112.     RETURN
  113. C
  114. C V103--    DEFLATE.
  115. C
  116. 23000    IF(.NOT.OBJACT(X)) CALL RSPEAK(369)
  117. C                        !OBJ HANDLE?
  118.     RETURN
  119. C VAPPLI, PAGE 4
  120. C
  121. C V104--    ALARM.  IF SLEEPING, WAKE HIM UP.
  122. C
  123. 24000    IF(and(OFLAG2(PRSO),SLEPBT).EQ.0) GO TO 24100
  124.     VAPPLI=OBJACT(X)
  125. C                        !SLEEPING, LET OBJ DO.
  126.     RETURN
  127. C
  128. 24100    CALL RSPSUB(370,ODO2)
  129. C                        !JOKE.
  130.     RETURN
  131. C
  132. C V105--    EXORCISE.  OBJECTS HANDLE.
  133. C
  134. 25000    F=OBJACT(X)
  135. C                        !OBJECTS HANDLE.
  136.     RETURN
  137. C
  138. C V106--    PLUG.  LET OBJECTS HANDLE.
  139. C
  140. 26000    IF(.NOT.OBJACT(X)) CALL RSPEAK(371)
  141.     RETURN
  142. C
  143. C V107--    KICK.  IF OBJECT IGNORES, JOKE.
  144. C
  145. 27000    IF(.NOT.OBJACT(X)) CALL RSPSB2(378,ODO2,RMK)
  146.     RETURN
  147. C
  148. C V108--    WAVE.  SAME.
  149. C
  150. 28000    IF(.NOT.OBJACT(X)) CALL RSPSB2(379,ODO2,RMK)
  151.     RETURN
  152. C
  153. C V109,V110--    RAISE, LOWER.  SAME.
  154. C
  155. 29000    CONTINUE
  156. 30000    IF(.NOT.OBJACT(X)) CALL RSPSB2(380,ODO2,RMK)
  157.     RETURN
  158. C
  159. C V111--    RUB.  SAME.
  160. C
  161. 31000    IF(.NOT.OBJACT(X)) CALL RSPSB2(381,ODO2,RMK)
  162.     RETURN
  163. C
  164. C V112--    PUSH.  SAME.
  165. C
  166. 32000    IF(.NOT.OBJACT(X)) CALL RSPSB2(382,ODO2,RMK)
  167.     RETURN
  168. C VAPPLI, PAGE 5
  169. C
  170. C V113--    UNTIE.  IF OBJECT IGNORES, JOKE.
  171. C
  172. 33000    IF(OBJACT(X)) RETURN
  173. C                        !OBJECT HANDLE?
  174.     I=383
  175. C                        !NO, NOT TIED.
  176.     IF(and(OFLAG2(PRSO),TIEBT).EQ.0) I=384
  177.     CALL RSPEAK(I)
  178.     RETURN
  179. C
  180. C V114--    TIE.  NEVER REALLY WORKS.
  181. C
  182. 34000    IF(and(OFLAG2(PRSO),TIEBT).NE.0) GO TO 34100
  183.     CALL RSPEAK(385)
  184. C                        !NOT TIEABLE.
  185.     RETURN
  186. C
  187. 34100    IF(.NOT.OBJACT(X)) CALL RSPSUB(386,ODO2)
  188. C                        !JOKE.
  189.     RETURN
  190. C
  191. C V115--    TIE UP.  NEVER REALLY WORKS.
  192. C
  193. 35000    IF(and(OFLAG2(PRSI),TIEBT).NE.0) GO TO 35100
  194.     CALL RSPSUB(387,ODO2)
  195. C                        !NOT TIEABLE.
  196.     RETURN
  197. C
  198. 35100    I=388
  199. C                        !ASSUME VILLAIN.
  200.     IF(and(OFLAG2(PRSO),VILLBT).EQ.0) I=389
  201.     CALL RSPSUB(I,ODO2)
  202. C                        !JOKE.
  203.     RETURN
  204. C
  205. C V116--    TURN.  OBJECT MUST HANDLE.
  206. C
  207. 36000    IF(and(OFLAG1(PRSO),TURNBT).NE.0) GO TO 36100
  208.     CALL RSPEAK(390)
  209. C                        !NOT TURNABLE.
  210.     RETURN
  211. C
  212. 36100    IF(and(OFLAG1(PRSI),TOOLBT).NE.0) GO TO 36200
  213.     CALL RSPSUB(391,ODI2)
  214. C                        !NOT A TOOL.
  215.     RETURN
  216. C
  217. 36200    VAPPLI=OBJACT(X)
  218. C                        !LET OBJECT HANDLE.
  219.     RETURN
  220. C
  221. C V117--    BREATHE.  BECOMES INFLATE WITH LUNGS.
  222. C
  223. 38000    PRSA=INFLAW
  224.     PRSI=LUNGS
  225.     GO TO 22000
  226. C                        !HANDLE LIKE INFLATE.
  227. C
  228. C V118--    KNOCK.  MOSTLY JOKE.
  229. C
  230. 39000    IF(OBJACT(X)) RETURN
  231. C                        !OBJ HANDLE?
  232.     I=394
  233. C                        !JOKE FOR DOOR.
  234.     IF(and(OFLAG1(PRSO),DOORBT).EQ.0) I=395
  235.     CALL RSPSUB(I,ODO2)
  236. C                        !JOKE FOR NONDOORS TOO.
  237.     RETURN
  238. C
  239. C V119--    LOOK.
  240. C
  241. 40000    IF(PRSO.NE.0) GO TO 41500
  242. C                        !SOMETHING TO LOOK AT?
  243.     VAPPLI=RMDESC(3)
  244. C                        !HANDLED BY RMDESC.
  245.     RETURN
  246. C
  247. C V120--    EXAMINE.
  248. C
  249. 41000    IF(PRSO.NE.0) GO TO 41500
  250. C                        !SOMETHING TO EXAMINE?
  251.     VAPPLI=RMDESC(0)
  252. C                        !HANDLED BY RMDESC.
  253.     RETURN
  254. C
  255. 41500    IF(OBJACT(X)) RETURN
  256. C                        !OBJ HANDLE?
  257.     I=OREAD(PRSO)
  258. C                        !GET READING MATERIAL.
  259.     IF(I.NE.0) CALL RSPEAK(I)
  260. C                        !OUTPUT IF THERE,
  261.     IF(I.EQ.0) CALL RSPSUB(429,ODO2)
  262. C                        !OTHERWISE DEFAULT.
  263.     PRSA=FOOW
  264. C                        !DEFUSE ROOM PROCESSORS.
  265.     RETURN
  266. C
  267. C V121--    SHAKE.  IF HOLLOW OBJECT, SOME ACTION.
  268. C
  269. 42000    IF(OBJACT(X)) RETURN
  270. C                        !OBJECT HANDLE?
  271.     IF(and(OFLAG2(PRSO),VILLBT).EQ.0) GO TO 42100
  272.     CALL RSPEAK(371)
  273. C                        !JOKE FOR VILLAINS.
  274.     RETURN
  275. C
  276. 42100    IF(QEMPTY(PRSO).OR.(and(OFLAG1(PRSO),TAKEBT).EQ.0))
  277. &        GO TO 10
  278.     IF(QOPEN(PRSO)) GO TO 42300
  279. C                        !OPEN?  SPILL.
  280.     CALL RSPSUB(396,ODO2)
  281. C                        !NO, DESCRIBE NOISE.
  282.     RETURN
  283. C
  284. 42300    CALL RSPSUB(397,ODO2)
  285. C                        !SPILL THE WORKS.
  286.     DO 42500 I=1,OLNT
  287. C                        !SPILL CONTENTS.
  288.       IF(OCAN(I).NE.PRSO) GO TO 42500
  289. C                        !INSIDE?
  290.       OFLAG2(I)=or(OFLAG2(I),TCHBT)
  291.       IF(AV.EQ.0) GO TO 42400
  292. C                        !IN VEHICLE?
  293.       CALL NEWSTA(I,0,0,AV,0)
  294. C                        !YES, SPILL IN THERE.
  295.       GO TO 42500
  296. C
  297. 42400      CALL NEWSTA(I,0,HERE,0,0)
  298. C                        !NO, SPILL ON FLOOR,
  299.       IF(I.EQ.WATER) CALL NEWSTA(I,133,0,0,0)
  300. C                        !BUT WATER DISAPPEARS.
  301. 42500    CONTINUE
  302.     RETURN
  303. C
  304. C V122--    MOVE.  MOSTLY JOKES.
  305. C
  306. 43000    IF(OBJACT(X)) RETURN
  307. C                        !OBJ HANDLE?
  308.     I=398
  309. C                        !ASSUME NOT HERE.
  310.     IF(QHERE(PRSO,HERE)) I=399
  311.     CALL RSPSUB(I,ODO2)
  312. C                        !JOKE.
  313.     RETURN
  314. C VAPPLI, PAGE 6
  315. C
  316. C V123--    TURN ON.
  317. C
  318. 44000    F=LIT(HERE)
  319. C                        !RECORD IF LIT.
  320.     IF(OBJACT(X)) GO TO 44300
  321. C                        !OBJ HANDLE?
  322.     IF((and(OFLAG1(PRSO),LITEBT).NE.0).AND.
  323. &        (OADV(PRSO).EQ.WINNER)) GO TO 44100
  324.     CALL RSPEAK(400)
  325. C                        !CANT DO IT.
  326.     RETURN
  327. C
  328. 44100    IF(and(OFLAG1(PRSO),ONBT).EQ.0) GO TO 44200
  329.     CALL RSPEAK(401)
  330. C                        !ALREADY ON.
  331.     RETURN
  332. C
  333. 44200    OFLAG1(PRSO)=or(OFLAG1(PRSO),ONBT)
  334.     CALL RSPSUB(404,ODO2)
  335. 44300    IF(.NOT.F .AND.LIT(HERE)) F=RMDESC(0)
  336. C                        !ROOM NEWLY LIT.
  337.     RETURN
  338. C
  339. C V124--    TURN OFF.
  340. C
  341. 45000    IF(OBJACT(X)) GO TO 45300
  342. C                        !OBJ HANDLE?
  343.     IF((and(OFLAG1(PRSO),LITEBT).NE.0).AND.
  344. &        (OADV(PRSO).EQ.WINNER)) GO TO 45100
  345.     CALL RSPEAK(402)
  346. C                        !CANT DO IT.
  347.     RETURN
  348. C
  349. 45100    IF(and(OFLAG1(PRSO),ONBT).NE.0) GO TO 45200
  350.     CALL RSPEAK(403)
  351. C                        !ALREADY OFF.
  352.     RETURN
  353. C
  354. 45200    OFLAG1(PRSO)=and(OFLAG1(PRSO), not(ONBT))
  355.     CALL RSPSUB(405,ODO2)
  356. 45300    IF(.NOT.LIT(HERE)) CALL RSPEAK(406)
  357. C                        !MAY BE DARK.
  358.     RETURN
  359. C
  360. C V125--    OPEN.  A FINE MESS.
  361. C
  362. 46000    IF(OBJACT(X)) RETURN
  363. C                        !OBJ HANDLE?
  364.     IF(and(OFLAG1(PRSO),CONTBT).NE.0) GO TO 46100
  365. 46050    CALL RSPSUB(407,ODO2)
  366. C                        !NOT OPENABLE.
  367.     RETURN
  368. C
  369. 46100    IF(OCAPAC(PRSO).NE.0) GO TO 46200
  370.     CALL RSPSUB(408,ODO2)
  371. C                        !NOT OPENABLE.
  372.     RETURN
  373. C
  374. 46200    IF(.NOT.QOPEN(PRSO)) GO TO 46225
  375.     CALL RSPEAK(412)
  376. C                        !ALREADY OPEN.
  377.     RETURN
  378. C
  379. 46225    OFLAG2(PRSO)=or(OFLAG2(PRSO),OPENBT)
  380.     IF((and(OFLAG1(PRSO),TRANBT).NE.0).OR.QEMPTY(PRSO))
  381. &        GO TO 46300
  382.     CALL PRINCO(PRSO,410)
  383. C                        !PRINT CONTENTS.
  384.     RETURN
  385. C
  386. 46300    CALL RSPEAK(409)
  387. C                        !DONE
  388.     RETURN
  389. C
  390. C V126--    CLOSE.
  391. C
  392. 47000    IF(OBJACT(X)) RETURN
  393. C                        !OBJ HANDLE?
  394.     IF(and(OFLAG1(PRSO),CONTBT).EQ.0) GO TO 46050
  395.     IF(OCAPAC(PRSO).NE.0) GO TO 47100
  396.     CALL RSPSUB(411,ODO2)
  397. C                        !NOT CLOSABLE.
  398.     RETURN
  399. C
  400. 47100    IF(QOPEN(PRSO)) GO TO 47200
  401. C                        !OPEN?
  402.     CALL RSPEAK(413)
  403. C                        !NO, JOKE.
  404.     RETURN
  405. C
  406. 47200    OFLAG2(PRSO)=and(OFLAG2(PRSO), not(OPENBT))
  407.     CALL RSPEAK(414)
  408. C                        !DONE.
  409.     RETURN
  410. C VAPPLI, PAGE 7
  411. C
  412. C V127--    FIND.  BIG MEGILLA.
  413. C
  414. 48000    IF(OBJACT(X)) RETURN
  415. C                        !OBJ HANDLE?
  416.     I=415
  417. C                        !DEFAULT CASE.
  418.     IF(QHERE(PRSO,HERE)) GO TO 48300
  419. C                        !IN ROOM?
  420.     IF(OADV(PRSO).EQ.WINNER) GO TO 48200
  421. C                        !ON WINNER?
  422.     J=OCAN(PRSO)
  423. C                        !DOWN ONE LEVEL.
  424.     IF(J.EQ.0) GO TO 10
  425.     IF(((and(OFLAG1(J),TRANBT).EQ.0).AND.
  426. &     (.NOT.QOPEN(J).OR.(and(OFLAG1(J),(DOORBT+CONTBT)).EQ.0))))
  427. &        GO TO 10
  428.     I=417
  429. C                        !ASSUME IN ROOM.
  430.     IF(QHERE(J,HERE)) GO TO 48100
  431.     IF(OADV(J).NE.WINNER) GO TO 10
  432. C                        !NOT HERE OR ON PERSON.
  433.     I=418
  434. 48100    CALL RSPSUB(I,ODESC2(J))
  435. C                        !DESCRIBE FINDINGS.
  436.     RETURN
  437. C
  438. 48200    I=416
  439. 48300    CALL RSPSUB(I,ODO2)
  440. C                        !DESCRIBE FINDINGS.
  441.     RETURN
  442. C
  443. C V128--    WAIT.  RUN CLOCK DEMON.
  444. C
  445. 49000    CALL RSPEAK(419)
  446. C                        !TIME PASSES.
  447.     DO 49100 I=1,3
  448.       IF(CLOCKD(X)) RETURN
  449. 49100    CONTINUE
  450.     RETURN
  451. C
  452. C V129--    SPIN.
  453. C V159--    TURN TO.
  454. C
  455. 50000    CONTINUE
  456. 88000    IF(.NOT.OBJACT(X)) CALL RSPEAK(663)
  457. C                        !IF NOT OBJ, JOKE.
  458.     RETURN
  459. C
  460. C V130--    BOARD.  WORKS WITH VEHICLES.
  461. C
  462. 51000    IF(and(OFLAG2(PRSO),VEHBT).NE.0) GO TO 51100
  463.     CALL RSPSUB(421,ODO2)
  464. C                        !NOT VEHICLE, JOKE.
  465.     RETURN
  466. C
  467. 51100    IF(QHERE(PRSO,HERE)) GO TO 51200
  468. C                        !HERE?
  469.     CALL RSPSUB(420,ODO2)
  470. C                        !NO, JOKE.
  471.     RETURN
  472. C
  473. 51200    IF(AV.EQ.0) GO TO 51300
  474. C                        !ALREADY GOT ONE?
  475.     CALL RSPSUB(422,ODO2)
  476. C                        !YES, JOKE.
  477.     RETURN
  478. C
  479. 51300    IF(OBJACT(X)) RETURN
  480. C                        !OBJ HANDLE?
  481.     CALL RSPSUB(423,ODO2)
  482. C                        !DESCRIBE.
  483.     AVEHIC(WINNER)=PRSO
  484.     IF(WINNER.NE.PLAYER) OCAN(AOBJ(WINNER))=PRSO
  485.     RETURN
  486. C
  487. C V131--    DISEMBARK.
  488. C
  489. 52000    IF(AV.EQ.PRSO) GO TO 52100
  490. C                        !FROM VEHICLE?
  491.     CALL RSPEAK(424)
  492. C                        !NO, JOKE.
  493.     RETURN
  494. C
  495. 52100    IF(OBJACT(X)) RETURN
  496. C                        !OBJ HANDLE?
  497.     IF(and(RFLAG(HERE),RLAND).NE.0) GO TO 52200
  498.     CALL RSPEAK(425)
  499. C                        !NOT ON LAND.
  500.     RETURN
  501. C
  502. 52200    AVEHIC(WINNER)=0
  503.     CALL RSPEAK(426)
  504.     IF(WINNER.NE.PLAYER) CALL NEWSTA(AOBJ(WINNER),0,HERE,0,0)
  505.     RETURN
  506. C
  507. C V132--    TAKE.  HANDLED EXTERNALLY.
  508. C
  509. 53000    VAPPLI=TAKE(.TRUE.)
  510.     RETURN
  511. C
  512. C V133--    INVENTORY.  PROCESSED EXTERNALLY.
  513. C
  514. 55000    CALL INVENT(WINNER)
  515.     RETURN
  516. C VAPPLI, PAGE 8
  517. C
  518. C V134--    FILL.  STRANGE DOINGS WITH WATER.
  519. C
  520. 56000    IF(PRSI.NE.0) GO TO 56050
  521. C                        !ANY OBJ SPECIFIED?
  522.     IF(and(RFLAG(HERE),(RWATER+RFILL)).NE.0) GO TO 56025
  523.     CALL RSPEAK(516)
  524. C                        !NOTHING TO FILL WITH.
  525.     PRSWON=.FALSE.
  526. C                        !YOU LOSE.
  527.     RETURN
  528. C
  529. 56025    PRSI=GWATE
  530. C                        !USE GLOBAL WATER.
  531. 56050    IF(OBJACT(X)) RETURN
  532. C                        !OBJ HANDLE?
  533.     IF((PRSI.NE.GWATE).AND.(PRSI.NE.WATER))
  534. &        CALL RSPSB2(444,ODI2,ODO2)
  535.     RETURN
  536. C
  537. C V135,V136--    EAT/DRINK
  538. C
  539. 58000    CONTINUE
  540. 59000    IF(OBJACT(X)) RETURN
  541. C                        !OBJ HANDLE?
  542.     IF(PRSO.EQ.GWATE) GO TO 59500
  543. C                        !DRINK GLOBAL WATER?
  544.     IF(.NOT.EDIBLE(PRSO)) GO TO 59400
  545. C                        !EDIBLE?
  546.     IF(OADV(PRSO).EQ.WINNER) GO TO 59200
  547. C                        !YES, ON WINNER?
  548. 59100    CALL RSPSUB(454,ODO2)
  549. C                        !NOT ACCESSIBLE.
  550.     RETURN
  551. C
  552. 59200    IF(PRSA.EQ.DRINKW) GO TO 59300
  553. C                        !DRINK FOOD?
  554.     CALL NEWSTA(PRSO,455,0,0,0)
  555. C                        !NO, IT DISAPPEARS.
  556.     RETURN
  557. C
  558. 59300    CALL RSPEAK(456)
  559. C                        !YES, JOKE.
  560.     RETURN
  561. C
  562. 59400    IF(.NOT.DRKBLE(PRSO)) GO TO 59600
  563. C                        !DRINKABLE?
  564.     IF(OCAN(PRSO).EQ.0) GO TO 59100
  565. C                        !YES, IN SOMETHING?
  566.     IF(OADV(OCAN(PRSO)).NE.WINNER) GO TO 59100
  567.     IF(QOPEN(OCAN(PRSO))) GO TO 59500
  568. C                        !CONT OPEN?
  569.     CALL RSPEAK(457)
  570. C                        !NO, JOKE.
  571.     RETURN
  572. C
  573. 59500    CALL NEWSTA(PRSO,458,0,0,0)
  574. C                        !GONE.
  575.     RETURN
  576. C
  577. 59600    CALL RSPSUB(453,ODO2)
  578. C                        !NOT FOOD OR DRINK.
  579.     RETURN
  580. C
  581. C V137--    BURN.  COMPLICATED.
  582. C
  583. 60000    IF(and(OFLAG1(PRSI),(FLAMBT+LITEBT+ONBT)).NE.
  584. &        (FLAMBT+LITEBT+ONBT)) GO TO 60400
  585.     IF(OBJACT(X)) RETURN
  586. C                        !OBJ HANDLE?
  587.     IF(OCAN(PRSO).NE.RECEP) GO TO 60050
  588. C                        !BALLOON?
  589.     IF(OAPPLI(OACTIO(BALLO),0)) RETURN
  590. C                        !DID IT HANDLE?
  591. 60050    IF(and(OFLAG1(PRSO),BURNBT).EQ.0) GO TO 60300
  592.     IF(OADV(PRSO).NE.WINNER) GO TO 60100
  593. C                        !CARRYING IT?
  594.     CALL RSPSUB(459,ODO2)
  595.     CALL JIGSUP(460)
  596.     RETURN
  597. C
  598. 60100    J=OCAN(PRSO)
  599. C                        !GET CONTAINER.
  600.     IF(QHERE(PRSO,HERE).OR. ((AV.NE.0).AND.(J.EQ.AV)))
  601. &        GO TO 60200
  602.     IF(J.EQ.0) GO TO 60150
  603. C                        !INSIDE?
  604.     IF(.NOT.QOPEN(J)) GO TO 60150
  605. C                        !OPEN?
  606.     IF(QHERE(J,HERE).OR.((AV.NE.0).AND.(OCAN(J).EQ.AV)))
  607. &        GO TO 60200
  608. 60150    CALL RSPEAK(461)
  609. C                        !CANT REACH IT.
  610.     RETURN
  611. C
  612. 60200    CALL RSPSUB(462,ODO2)
  613. C                        !BURN IT.
  614.     CALL NEWSTA(PRSO,0,0,0,0)
  615.     RETURN
  616. C
  617. 60300    CALL RSPSUB(463,ODO2)
  618. C                        !CANT BURN IT.
  619.     RETURN
  620. C
  621. 60400    CALL RSPSUB(301,ODI2)
  622. C                        !CANT BURN IT WITH THAT.
  623.     RETURN
  624. C VAPPLI, PAGE 9
  625. C
  626. C V138--    MUNG.  GO TO COMMON ATTACK CODE.
  627. C
  628. 63000    I=466
  629. C                        !CHOOSE PHRASE.
  630.     IF(and(OFLAG2(PRSO),VILLBT).NE.0) GO TO 66100
  631.     IF(.NOT.OBJACT(X)) CALL RSPSB2(466,ODO2,RMK)
  632.     RETURN
  633. C
  634. C V139--    KILL.  GO TO COMMON ATTACK CODE.
  635. C
  636. 64000    I=467
  637. C                        !CHOOSE PHRASE.
  638.     GO TO 66100
  639. C
  640. C V140--    SWING.  INVERT OBJECTS, FALL THRU TO ATTACK.
  641. C
  642. 65000    J=PRSO
  643. C                        !INVERT.
  644.     PRSO=PRSI
  645.     PRSI=J
  646.     J=ODO2
  647.     ODO2=ODI2
  648.     ODI2=J
  649.     PRSA=ATTACW
  650. C                        !FOR OBJACT.
  651. C
  652. C V141--    ATTACK.  FALL THRU TO ATTACK CODE.
  653. C
  654. 66000    I=468
  655. C
  656. C COMMON MUNG/ATTACK/SWING/KILL CODE.
  657. C
  658. 66100    IF(PRSO.NE.0) GO TO 66200
  659. C                        !ANYTHING?
  660.     CALL RSPEAK(469)
  661. C                        !NO, JOKE.
  662.     RETURN
  663. C
  664. 66200    IF(OBJACT(X)) RETURN
  665. C                        !OBJ HANDLE?
  666.     IF(and(OFLAG2(PRSO),VILLBT).NE.0) GO TO 66300
  667.     IF(and(OFLAG1(PRSO),VICTBT).EQ.0)
  668. &        CALL RSPSUB(470,ODO2)
  669.     RETURN
  670. C
  671. 66300    J=471
  672. C                        !ASSUME NO WEAPON.
  673.     IF(PRSI.EQ.0) GO TO 66500
  674.     IF(and(OFLAG2(PRSI),WEAPBT).EQ.0) GO TO 66400
  675.     MELEE=1
  676. C                        !ASSUME SWORD.
  677.     IF(PRSI.NE.SWORD) MELEE=2
  678. C                        !MUST BE KNIFE.
  679.     I=BLOW(PLAYER,PRSO,MELEE,.TRUE.,0)
  680. C                        !STRIKE BLOW.
  681.     RETURN
  682. C
  683. 66400    J=472
  684. C                        !NOT A WEAPON.
  685. 66500    CALL RSPSB2(I,ODO2,J)
  686. C                        !JOKE.
  687.     RETURN
  688. C VAPPLI, PAGE 10
  689. C
  690. C V142--    WALK.  PROCESSED EXTERNALLY.
  691. C
  692. 68000    VAPPLI=WALK(X)
  693.     RETURN
  694. C
  695. C V143--    TELL.  PROCESSED IN GAME.
  696. C
  697. 69000    CALL RSPEAK(603)
  698.     RETURN
  699. C
  700. C V144--    PUT.  PROCESSED EXTERNALLY.
  701. C
  702. 70000    VAPPLI=PUT(.TRUE.)
  703.     RETURN
  704. C
  705. C V145,V146,V147,V148--    DROP/GIVE/POUR/THROW
  706. C
  707. 71000    CONTINUE
  708. 72000    CONTINUE
  709. 73000    CONTINUE
  710. 74000    VAPPLI=DROP(.FALSE.)
  711.     RETURN
  712. C
  713. C V149--    SAVE
  714. C
  715. 77000    IF(and(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 77100
  716.     CALL RSPEAK(828)
  717. C                        !NO SAVES IN ENDGAME.
  718.     RETURN
  719. C
  720. 77100    CALL SAVEGM
  721.     RETURN
  722. C
  723. C V150--    RESTORE
  724. C
  725. #ifdef PDP
  726. 78000    call restor
  727. #else
  728. 78000    IF(and(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 78100
  729.     CALL RSPEAK(829)
  730. C                        !NO RESTORES IN ENDGAME.
  731.      RETURN
  732. C
  733. 78100    CALL RSTRGM
  734. #endif PDP
  735.     RETURN
  736. C VAPPLI, PAGE 11
  737. C
  738. C V151--    HELLO
  739. C
  740. 80000    IF(PRSO.NE.0) GO TO 80100
  741. C                        !ANY OBJ?
  742.     CALL RSPEAK(346+RND(4))
  743. C                        !NO, VANILLA HELLO.
  744.     RETURN
  745. C
  746. 80100    IF(PRSO.NE.AVIAT) GO TO 80200
  747. C                        !HELLO AVIATOR?
  748.     CALL RSPEAK(350)
  749. C                        !NOTHING HAPPENS.
  750.     RETURN
  751. C
  752. 80200    IF(PRSO.NE.SAILO) GO TO 80300
  753. C                        !HELLO SAILOR?
  754.     HS=HS+1
  755. C                        !COUNT.
  756.     I=351
  757. C                        !GIVE NORMAL OR
  758.     IF(MOD(HS,10).EQ.0) I=352
  759. C                        !RANDOM MESSAGE.
  760.     IF(MOD(HS,20).EQ.0) I=353
  761.     CALL RSPEAK(I)
  762. C                        !SPEAK UP.
  763.     RETURN
  764. C
  765. 80300    IF(OBJACT(X)) RETURN
  766. C                        !OBJ HANDLE?
  767.     I=354
  768. C                        !ASSUME VILLAIN.
  769.     IF(and(OFLAG2(PRSO),(VILLBT+ACTRBT)).EQ.0) I=355
  770.     CALL RSPSUB(I,ODO2)
  771. C                        !HELLO THERE
  772. C                        !
  773.     RETURN
  774. C
  775. C V152--    LOOK INTO
  776. C
  777. 81000    IF(OBJACT(X)) RETURN
  778. C                        !OBJ HANDLE?
  779.     IF(and(OFLAG1(PRSO),DOORBT).EQ.0) GO TO 81300
  780.     IF(.NOT.QOPEN(PRSO)) GO TO 81200
  781. C                        !OPEN?
  782.     CALL RSPSUB(628,ODO2)
  783. C                        !OPEN DOOR- UNINTERESTING.
  784.     RETURN
  785. C
  786. 81200    CALL RSPSUB(525,ODO2)
  787. C                        !CLOSED DOOR- CANT SEE.
  788.     RETURN
  789. C
  790. 81300    IF(and(OFLAG2(PRSO),VEHBT).NE.0) GO TO 81400
  791.     IF(QOPEN(PRSO).OR.(and(OFLAG1(PRSO),TRANBT).NE.0))
  792. &        GO TO 81400
  793.     IF(and(OFLAG1(PRSO),CONTBT).NE.0) GO TO 81200
  794.     CALL RSPSUB(630,ODO2)
  795. C                        !CANT LOOK INSIDE.
  796.     RETURN
  797. C
  798. 81400    IF(QEMPTY(PRSO)) GO TO 81500
  799. C                        !VEH OR SEE IN.  EMPTY?
  800.     CALL PRINCO(PRSO,573)
  801. C                        !NO, LIST CONTENTS.
  802.     RETURN
  803. C
  804. 81500    CALL RSPSUB(629,ODO2)
  805. C                        !EMPTY.
  806.     RETURN
  807. C
  808. C V153--    LOOK UNDER
  809. C
  810. 82000    IF(.NOT.OBJACT(X)) CALL RSPEAK(631)
  811. C                        !OBJECT HANDLE?
  812.     RETURN
  813. C VAPPLI, PAGE 12
  814. C
  815. C V154--    PUMP
  816. C
  817. 83000    IF((OROOM(PUMP).EQ.HERE).OR.(OADV(PUMP).EQ.WINNER))
  818. &        GO TO 83100
  819.     CALL RSPEAK(632)
  820. C                        !NO.
  821.     RETURN
  822. C
  823. 83100    PRSI=PUMP
  824. C                        !BECOMES INFLATE
  825.     PRSA=INFLAW
  826. C                        !X WITH PUMP.
  827.     GO TO 22000
  828. C                        !DONE.
  829. C
  830. C V155--    WIND
  831. C
  832. 84000    IF(.NOT.OBJACT(X)) CALL RSPSUB(634,ODO2)
  833. C                        !OBJ HANDLE?
  834.     RETURN
  835. C
  836. C V156--    CLIMB
  837. C V157--    CLIMB UP
  838. C V158--    CLIMB DOWN
  839. C
  840. 85000    CONTINUE
  841. 86000    CONTINUE
  842. 87000    I=XUP
  843. C                        !ASSUME UP.
  844.     IF(PRSA.EQ.CLMBDW) I=XDOWN
  845. C                        !UNLESS CLIMB DN.
  846.     F=(and(OFLAG2(PRSO),CLMBBT)).NE.0
  847.     IF(F.AND.FINDXT(I,HERE)) GO TO 87500
  848. C                        !ANYTHING TO CLIMB?
  849.     IF(OBJACT(X)) RETURN
  850. C                        !OBJ HANDLE?
  851.     I=657
  852.     IF(F) I=524
  853. C                        !VARIETY OF JOKES.
  854.     IF(.NOT.F .AND.((PRSO.EQ.WALL).OR.
  855. &        ((PRSO.GE.WNORT).AND.(PRSO.LE.WNORT+3))))
  856. &        I=656
  857.     CALL RSPEAK(I)
  858. C                        !JOKE.
  859.     RETURN
  860. C
  861. 87500    PRSA=WALKW
  862. C                        !WALK
  863.     PRSO=I
  864. C                        !IN SPECIFIED DIR.
  865.     VAPPLI=WALK(X)
  866.     RETURN
  867. C
  868.     END
  869. C CLOCKD- CLOCK DEMON FOR INTERMOVE CLOCK EVENTS
  870. C
  871. C DECLARATIONS
  872. C
  873.     LOGICAL FUNCTION CLOCKD(X)
  874.     IMPLICIT INTEGER (A-Z)
  875. C
  876. C CLOCK INTERRUPTS
  877. C
  878. #include "clock.h"
  879. C
  880.     CLOCKD=.FALSE.
  881. C                        !ASSUME NO ACTION.
  882.     DO 100 I=1,CLNT
  883.       IF(.NOT.CFLAG(I) .OR.(CTICK(I).EQ.0)) GO TO 100
  884.       IF(CTICK(I).LT.0) GO TO 50
  885. C                        !PERMANENT ENTRY?
  886.       CTICK(I)=CTICK(I)-1
  887.       IF(CTICK(I).NE.0) GO TO 100
  888. C                        !TIMER EXPIRED?
  889. 50      CLOCKD=.TRUE.
  890.       CALL CEVAPP(CACTIO(I))
  891. C                        !DO ACTION.
  892. 100    CONTINUE
  893.     RETURN
  894. C
  895.     END
  896.